Certbot - 简化SSL证书管理

Tips:由于笔者的服务器为CentOS 7版本,因此本文将基于CentOS 7操作系统进行阐述

1. 简介

Certbot是一个由Electronic Frontier Foundation (EFF) 开发的免费、开源工具,用于简化在服务器上部署和管理SSL / TSL证书的过程,该工具涵盖了证书获取、更新、删除等功能,省去了以往从云厂商平台获取证书 - 上传至服务器 - 调配的繁琐过程,并且Certbot支持在后台生成一个定时任务以定时刷新证书

2. 安装

每个操作系统的安装方式的各有千秋,建议进入Certbot官网选择对应的操作系统查阅关联的安装步骤,如下所示:

certbot-official-website

如果你恰巧是CentOS 7版本,恭喜!可以直接根据本篇笔记进行Certbot工具的安装与使用,官网推荐使用Snapd进行快速安装

a. Snapd

Tips: Snapd一种软件包管理系统,可以在各种不同的 Linux 发行版上运行,包括 Ubuntu、Debian、Fedora、CentOS 等,它还支持多种硬件架构,包括 x86、ARM

在CentOS安装Snapd前,需要预先安装epel-release,安装指令如下:

1
$ sudo yum install epel-release

Tips: epel-release是 Extra Packages for Enterprise Linux(EPEL)的缩写,是为 Red Hat Enterprise Linux(RHEL)及其衍生发行版操作系统提供额外软件包的一个项目,这些额外的软件包通常包含了一些不在官方软件仓库中的软件,如开源的工具、库和应用程序等,安装这个软件包的目的在于将默认不在官方仓库中的软件包加入进来,并且能够使用系统的包管理器 (yum) 进行安装

安装EPEL额外软件包仓库后,通过以下命令安装Snapd

1
$ sudo yum install snapd

安装完成后,通过以下命令启动Snapd服务:

1
$ sudo systemctl enable --now snapd.socket

通过以下命令创建Snapd的软链接,目的是为了方便默认情况下使用Snapd安装的应用程序能够从/var/lib/snapd/snap映射到/snap目录下

1
$ sudo ln -s /var/lib/snapd/snap /snap

至此,Snapd安装完成,可通过snap --version查看对应的版本号,如下所示:

1
2
3
4
5
6
$ snap --version
snap 2.61.2-0.el7
snapd 2.61.2-0.el7
series 16
centos 7
kernel 3.10.0-1062.18.1.el7.x86_64

b. Certbot

在正式安装前,需要卸载已有的Certbot工具,CentOS操作系统可以通过以下命令进行卸载:

1
$ sudo yum remove certbot

在清理掉系统原有的Certbot工具后,便可以通过以下命令使用Snapd进行快速安装:

1
$ sudo snap install --classic certbot

安装完成后,为其创建可执行的软链接:

1
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

通过certbot --version可以判断是否已经正常安装,如下所示:

1
2
$ certbot --version
certbot 2.9.0

至此,Certbot工具已安装完成

3. 使用

Tips:在使用Certbot工具前,需要确保nginx关闭,因为默认情况下nginx会占用80端口,同时需要确保80端口与443端口外网可通

  • 前往云厂商域名管理平台,将需要生成SSL证书的域名解析指向当前服务器
  • 进入服务器,使用nginx -s stop关闭nginx服务,以确保80端口不被占用,因为Certbot工具会在生成证书的时候在本地启动一个Web服务,该服务默认使用的是80端口
  • 生成指定域名的SSL证书,其中-d参数后跟着的是需要生成证书的域名,-m参数后跟着的是个人邮箱
1
$ certbot certonly --standalone -d zchengb.top -m zxchengb@163.com --agree-tos --no-eff-email
  • 通过以上命令生成SSL证书后,复制生成证书的路径,进入nginx.conf配置文件,进行域名证书配置,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 default_server ssl;
server_name <此处填写您的域名>;
ssl_certificate /etc/letsencrypt/live/<需要生成SSL证书的域名>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<需要生成SSL证书的域名>/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;


location / {
proxy_pass <需要转发的目标地址>;
}
}
  • 需要后续需要手动刷新SSL证书,可通过sudo certbot renew命令进行刷新
  • 默认情况下,在certbot生成证书后,会在系统内默认写入一个定时任务用于定期刷新证书,CentOS 7可通过systemctl list-timers命令进行确认,如下所示:
1
2
3
4
5
6
7
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2024-03-25 02:42:00 CST 2h 16min left Sun 2024-03-24 17:25:00 CST 7h ago snap.certbot.renew.timer snap.certbot.renew.service
Mon 2024-03-25 13:24:37 CST 12h left Sun 2024-03-24 13:24:37 CST 11h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

2 timers listed.
Pass --all to see loaded but inactive timers, too.

自动刷新证书也是certbot的精华所在,基于此可以免去3个月更新一次SSL证书的烦恼,如果通过以上命令未查看到对应的定时任务,也可以检查以下目录下的文件:

  • /etc/crontab/
  • /etc/cron.*/*

其他常用命令

  • sudo certbot renew:手动触发证书更新(需要通过关闭80端口来确保更新成功)
  • sudo certbot delete:删除不再需要的证书
  • sudo certbot certificates:列出当前系统中安装的所有证书

至此,已完成SSL证书的配置,在完成Nginx配置后,可以通过nginx命令启动nginx服务,并通过浏览器访问https://<您的域名>来确认SSL证书是否已生效